/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.cont.manager;

import com.brain.cont.dto.ContratoDto;
import com.brain.cont.view.util.ConstantesCont;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.manager.*;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ConstantesCore;
import com.brain.sele.dto.PostulanteDto;
import com.brain.sele.manager.PostulanteManager;
import com.brain.sele.view.util.ConstantesSele;
import com.brain.sgc.dto.PersonaDto;
import com.brain.sgc.manager.PersonaManager;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Hvives
 */
@Service
public class ContratoManager extends ComunManager<ContratoDto> implements Serializable {

    private static Logger logger = Logger.getLogger(ContratoManager.class);
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private PersonaManager personaManager;
    @Resource
    private PostulanteManager postulanteManager;
    @Resource
    private DAOGenerico<ContratoDto> springHibernateDao;

    public ContratoDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(ContratoDto.class, id);
    }

    public List<ContratoDto> obtenerGralContratos(ContratoDto dtoFiltro) throws DAOException {
        List<ContratoDto> lista = null;
        Map<String, Object> mapFiltro = new HashMap<String, Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            mapFiltro.put("id", dtoFiltro.getId());
        }

        if (dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId() != null && !dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("personaDto.tipoDocumentoDto.id", dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId());
        }

        if (dtoFiltro.getPersonaDto().getNumeroDocumento() != null && dtoFiltro.getPersonaDto().getNumeroDocumento().length() != 0) {
            mapFiltro.put("personaDto.numeroDocumento", dtoFiltro.getPersonaDto().getNumeroDocumento());
        }

        if (dtoFiltro.getPersonaDto().getNombreCompleto() != null && dtoFiltro.getPersonaDto().getNombreCompleto().length() != 0) {
            mapFiltro.put("personaDto.nombreCompleto", dtoFiltro.getPersonaDto().getNombreCompleto());
        }

        if (dtoFiltro.getPersonaDto().getSexoDto().getId() != null && !dtoFiltro.getPersonaDto().getSexoDto().getId().equals(0L) && !dtoFiltro.getPersonaDto().getSexoDto().getId().equals(99L)) {
            mapFiltro.put("personaDto.sexoDto.id", dtoFiltro.getPersonaDto().getSexoDto().getId());
        }

        if (dtoFiltro.getSedeDto().getId() != null && !dtoFiltro.getSedeDto().getId().equals(0L) && !dtoFiltro.getSedeDto().getId().equals(99L)) {
            mapFiltro.put("sedeDto.id", dtoFiltro.getSedeDto().getId());
        }


        if (dtoFiltro.getTipoContratoDto().getId() != null && !dtoFiltro.getTipoContratoDto().getId().equals(0L) && !dtoFiltro.getTipoContratoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("tipoContratoDto.id", dtoFiltro.getTipoContratoDto().getId());
        }

        if (dtoFiltro.getEstadoDto().getId() != null && !dtoFiltro.getEstadoDto().getId().equals(0L) && !dtoFiltro.getEstadoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("estadoDto.id", dtoFiltro.getEstadoDto().getId());
        }

        Map<String, String> mapOrden = new HashMap<String, String>();
        mapOrden.put("personaDto.apellidoPaterno", "asc");

        try {
            lista = obtenerConFiltroConOrden(mapFiltro, mapOrden);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);

        }
        return lista;
    }

    public List<ContratoDto> obtenerContratosNoEnviadosPlanilla(ContratoDto dtoFiltro) throws DAOException {
        List<ContratoDto> lista = null;
        Map<String, Object> mapFiltro = new HashMap<String, Object>();

        if (dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId() != null && !dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("personaDto.tipoDocumentoDto.id", dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId());
        }

        if (dtoFiltro.getPersonaDto().getNumeroDocumento() != null && dtoFiltro.getPersonaDto().getNumeroDocumento().length() != 0) {
            mapFiltro.put("personaDto.numeroDocumento", dtoFiltro.getPersonaDto().getNumeroDocumento());
        }

        if (dtoFiltro.getPersonaDto().getNombreCompleto() != null && dtoFiltro.getPersonaDto().getNombreCompleto().length() != 0) {
            mapFiltro.put("personaDto.nombreCompleto", dtoFiltro.getPersonaDto().getNombreCompleto());
        }

        if (dtoFiltro.getPersonaDto().getSexoDto().getId() != null && !dtoFiltro.getPersonaDto().getSexoDto().getId().equals(0L) && !dtoFiltro.getPersonaDto().getSexoDto().getId().equals(99L)) {
            mapFiltro.put("personaDto.sexoDto.id", dtoFiltro.getPersonaDto().getSexoDto().getId());
        }

        if (dtoFiltro.getSedeDto().getId() != null && !dtoFiltro.getSedeDto().getId().equals(0L) && !dtoFiltro.getSedeDto().getId().equals(99L)) {
            mapFiltro.put("sedeDto.id", dtoFiltro.getSedeDto().getId());
        }

        if (dtoFiltro.getTipoContratoDto().getId() != null && !dtoFiltro.getTipoContratoDto().getId().equals(0L) && !dtoFiltro.getTipoContratoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("tipoContratoDto.id", dtoFiltro.getTipoContratoDto().getId());
        }

        mapFiltro.put("estadoDto.id", ConstantesCont.Parametro.CONT_ESTADO_GENERADO);

        Map<String, String> mapOrden = new HashMap<String, String>();
        mapOrden.put("personaDto.apellidoPaterno", "asc");

        try {
            lista = obtenerConFiltroConOrden(mapFiltro, mapOrden);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);

        }
        return lista;
    }

    public List<ContratoDto> obtenerContratosPorRecategorizar(ContratoDto dtoFiltro) throws DAOException {
        String hqsql = "select e from ContratoDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId() != null && !dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            hqsql += " and e.personaDto.tipodocumentoDto.id = ?";
            listaParametros.add(dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId());
        }

        if (dtoFiltro.getPersonaDto().getNumeroDocumento() != null && dtoFiltro.getPersonaDto().getNumeroDocumento().length() != 0) {
            hqsql += " and upper(e.personaDto.numeroDocumento) like '%" + dtoFiltro.getPersonaDto().getNumeroDocumento().toUpperCase() + "%'";
        }

        if (dtoFiltro.getPersonaDto().getNombreCompleto() != null && dtoFiltro.getPersonaDto().getNombreCompleto().length() != 0) {
            hqsql += " and upper(e.personaDto.nombreCompleto) like '%" + dtoFiltro.getPersonaDto().getNombreCompleto().toUpperCase() + "%'";
        }

        if (dtoFiltro.getPersonaDto().getSexoDto().getId() != null && !dtoFiltro.getPersonaDto().getSexoDto().getId().equals(0L) && !dtoFiltro.getPersonaDto().getSexoDto().getId().equals(99L)) {
            hqsql += " and e.personaDto.sexoDto.id = ?";
            listaParametros.add(dtoFiltro.getPersonaDto().getSexoDto().getId());
        }

        if (dtoFiltro.getSedeDto().getId() != null && !dtoFiltro.getSedeDto().getId().equals(0L) && !dtoFiltro.getSedeDto().getId().equals(99L)) {
            hqsql += " and e.sedeDto.id = ?";
            listaParametros.add(dtoFiltro.getSedeDto().getId());
        }


        if (dtoFiltro.getTipoContratoDto().getId() != null && !dtoFiltro.getTipoContratoDto().getId().equals(0L) && !dtoFiltro.getTipoContratoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            hqsql += " and e.tipoContratoDto.id = ?";
            listaParametros.add(dtoFiltro.getTipoContratoDto().getId());
        }

        hqsql += " and e.estadoDto.id=? ";
        listaParametros.add(ConstantesCont.Parametro.CONT_ESTADO_VIGENTE);

        hqsql += " and (e.fechaRecategorizacion - " + ConstantesCont.ValoresConstantes.DIAS_POR_RECATEGORIZAR + ") <= '" + UtilCore.Fecha.obtenerFechaActual() + "'";

        hqsql += " order by  e.personaDto.apellidoPaterno asc ";

        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<ContratoDto> obtenerContratosPorContratar(ContratoDto dtoFiltro) throws DAOException {
        String hqsql = "select e from ContratoDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId() != null && !dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            hqsql += " and e.personaDto.tipodocumentoDto.id = ?";
            listaParametros.add(dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId());
        }

        if (dtoFiltro.getPersonaDto().getNumeroDocumento() != null && dtoFiltro.getPersonaDto().getNumeroDocumento().length() != 0) {
            hqsql += " and upper(e.personaDto.numeroDocumento) like '%" + dtoFiltro.getPersonaDto().getNumeroDocumento().toUpperCase() + "%'";
        }

        if (dtoFiltro.getPersonaDto().getNombreCompleto() != null && dtoFiltro.getPersonaDto().getNombreCompleto().length() != 0) {
            hqsql += " and upper(e.personaDto.nombreCompleto) like '%" + dtoFiltro.getPersonaDto().getNombreCompleto().toUpperCase() + "%'";
        }

        if (dtoFiltro.getPersonaDto().getSexoDto().getId() != null && !dtoFiltro.getPersonaDto().getSexoDto().getId().equals(0L) && !dtoFiltro.getPersonaDto().getSexoDto().getId().equals(99L)) {
            hqsql += " and e.personaDto.sexoDto.id = ?";
            listaParametros.add(dtoFiltro.getPersonaDto().getSexoDto().getId());
        }

        if (dtoFiltro.getSedeDto().getId() != null && !dtoFiltro.getSedeDto().getId().equals(0L) && !dtoFiltro.getSedeDto().getId().equals(99L)) {
            hqsql += " and e.sedeDto.id = ?";
            listaParametros.add(dtoFiltro.getSedeDto().getId());
        }


        if (dtoFiltro.getTipoContratoDto().getId() != null && !dtoFiltro.getTipoContratoDto().getId().equals(0L) && !dtoFiltro.getTipoContratoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            hqsql += " and e.tipoContratoDto.id = ?";
            listaParametros.add(dtoFiltro.getTipoContratoDto().getId());
        }

        hqsql += " and e.estadoDto.id=? ";
        listaParametros.add(ConstantesCont.Parametro.CONT_ESTADO_VIGENTE);

        hqsql += " and (e.fechaFin - " + ConstantesCont.ValoresConstantes.DIAS_POR_RENOVAR + ") <= '" + UtilCore.Fecha.obtenerFechaActual() + "'";

        hqsql += " order by  e.personaDto.apellidoPaterno asc ";

        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<ContratoDto> obtenerContratosPorNivelar(ContratoDto dtoFiltro) throws DAOException {
        String hqsql = "select e from ContratoDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId() != null && !dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            hqsql += " and e.personaDto.tipodocumentoDto.id = ?";
            listaParametros.add(dtoFiltro.getPersonaDto().getTipoDocumentoDto().getId());
        }

        if (dtoFiltro.getPersonaDto().getNumeroDocumento() != null && dtoFiltro.getPersonaDto().getNumeroDocumento().length() != 0) {
            hqsql += " and upper(e.personaDto.numeroDocumento) like '%" + dtoFiltro.getPersonaDto().getNumeroDocumento().toUpperCase() + "%'";
        }

        if (dtoFiltro.getPersonaDto().getNombreCompleto() != null && dtoFiltro.getPersonaDto().getNombreCompleto().length() != 0) {
            hqsql += " and upper(e.personaDto.nombreCompleto) like '%" + dtoFiltro.getPersonaDto().getNombreCompleto().toUpperCase() + "%'";
        }

        if (dtoFiltro.getPersonaDto().getSexoDto().getId() != null && !dtoFiltro.getPersonaDto().getSexoDto().getId().equals(0L) && !dtoFiltro.getPersonaDto().getSexoDto().getId().equals(99L)) {
            hqsql += " and e.personaDto.sexoDto.id = ?";
            listaParametros.add(dtoFiltro.getPersonaDto().getSexoDto().getId());
        }

        if (dtoFiltro.getSedeDto().getId() != null && !dtoFiltro.getSedeDto().getId().equals(0L) && !dtoFiltro.getSedeDto().getId().equals(99L)) {
            hqsql += " and e.sedeDto.id = ?";
            listaParametros.add(dtoFiltro.getSedeDto().getId());
        }


        if (dtoFiltro.getTipoContratoDto().getId() != null && !dtoFiltro.getTipoContratoDto().getId().equals(0L) && !dtoFiltro.getTipoContratoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            hqsql += " and e.tipoContratoDto.id = ?";
            listaParametros.add(dtoFiltro.getTipoContratoDto().getId());
        }

        hqsql += " and e.estadoDto.id=? ";
        listaParametros.add(ConstantesCont.Parametro.CONT_ESTADO_VIGENTE);
        //hqsql += " and e.remBasica < e.remAlCargo ";
        hqsql += " and (e.fechaNivelacion - " + ConstantesCont.ValoresConstantes.DIAS_POR_NIVELAR + ") <= '" + UtilCore.Fecha.obtenerFechaActual() + "'";
        hqsql += " order by  e.personaDto.apellidoPaterno asc ";

        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<ContratoDto> obtenerContratosPorPersona(Long idPerson) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select e from ContratoDto as e ";
        hqsql += " where e.personaDto.id = ?";
        listaParametros.add(idPerson);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);

    }

    public ContratoDto guardar(ContratoDto dto, PostulanteDto dtoPost, String accionCont) {

        ContratoDto to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        if (this.validarDatosContrato(dto)) {
            // if (dto.getRemAlCargo().compareTo(dto.getRemBasica()) >= 0) {
            if (sessionMBean.getAccion() == ConstantesSele.Formulario.NUEVO) {
                try {
                    List<ContratoDto> listCont = this.obtenerContratosPorPersona(dto.getPersonaDto().getId());
                    UtilCore.General.toUpperCaseDto(dto);

                    if (accionCont.equals(ConstantesCont.Formulario.TIPO_CONT_NUEVO)) {
                        if (dto.getPersonaDto().getContVigenteDto() != null && dto.getPersonaDto().getEmp()) {
                            ContratoDto oldCont = this.obtenerPorId(dto.getPersonaDto().getContVigenteDto().getId());
                            oldCont.setEstadoDto(new ParametroDto(ConstantesCont.Parametro.CONT_ESTADO_ARCHIVADO));
                            oldCont.setUsuarioCeseDto(sessionMBean.getSessionUsuarioDto());
                            oldCont.setFechaCese(UtilCore.Fecha.obtenerFechaActualDate());
                            dto.setUsuarioSuscripcion(sessionMBean.getSessionUsuarioDto().getId());
                            dto.setFechaSuscripcion(UtilCore.Fecha.obtenerFechaActualDate());
                            dto.setTerminalSuscripcion(sessionMBean.getSessionTerminal());
                            oldCont.setObservacionCese(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.obs.cese.post.interno"));
                            editar(oldCont);
                        }
                    } else if (accionCont.equals(ConstantesCont.Formulario.TIPO_CONT_RECAT)) {
                        ContratoDto oldCont = this.obtenerPorId(dto.getPersonaDto().getContVigenteDto().getId());
                        oldCont.setEstadoDto(new ParametroDto(ConstantesCont.Parametro.CONT_ESTADO_RECATEGORIZADO));
                        oldCont.setUsuarioRecategDto(sessionMBean.getSessionUsuarioDto());
                        oldCont.setFechaRecategorizacionReal(UtilCore.Fecha.obtenerFechaActualDate());
                        editar(oldCont);
                    } else if (accionCont.equals(ConstantesCont.Formulario.TIPO_CONT_RENOVAR)) {
                        ContratoDto oldCont = this.obtenerPorId(dto.getPersonaDto().getContVigenteDto().getId());
                        oldCont.setEstadoDto(new ParametroDto(ConstantesCont.Parametro.CONT_ESTADO_ARCHIVADO));
                        oldCont.setUsuarioCeseDto(sessionMBean.getSessionUsuarioDto());
                        oldCont.setFechaCese(UtilCore.Fecha.obtenerFechaActualDate());
                        editar(oldCont);
                    } else if (accionCont.equals(ConstantesCont.Formulario.TIPO_CONT_NIVELAR)) {
                        ContratoDto oldCont = this.obtenerPorId(dto.getPersonaDto().getContVigenteDto().getId());
                        oldCont.setEstadoDto(new ParametroDto(ConstantesCont.Parametro.CONT_ESTADO_NIVELADO));
                        oldCont.setUsuarioNivelacionDto(sessionMBean.getSessionUsuarioDto());
                        oldCont.setFechaNivelacionReal(UtilCore.Fecha.obtenerFechaActualDate());
                        editar(oldCont);
                    }
                    nuevo(dto);
                    if (listCont.isEmpty()) {
                        //Cambiamos el estado del postulante a contratado
                        if (dtoPost != null) {
                            dtoPost.setEstadoDto(new ParametroDto(ConstantesSele.Parametro.POST_ESTADO_CONTRATADO));
                            this.postulanteManager.editar(dtoPost);
                            //Activamos el flag de la persona para indicar que ya es un empleado
                            dto.getPersonaDto().setEmp(Boolean.TRUE);
                            this.personaManager.editar(dto.getPersonaDto());
                        }
                    }
                    //Guardamos el contrato vigente en la persona
                    dto.getPersonaDto().setContVigenteDto(dto);
                    dto.getPersonaDto().setPuestoDto(dto.getPuestoDto());
                    dto.getPersonaDto().setSedeDto(dto.getSedeDto());
                    this.personaManager.editar(dto.getPersonaDto());
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                    recursosManager.showMessage(mensajeTrx);
                    to = dto;
                } catch (Exception ex) {
                    mensajeTrx = ex.getMessage();
                    recursosManager.showError(ex.getMessage());
                    logger.error(mensajeTrx);

                    to = null;
                }
            } else if (sessionMBean.getAccion() == ConstantesSele.Formulario.EDITAR) {
                try {
                    dto.setUsuario(sessionMBean.getSessionUsuarioDto().getId());
                    dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                    dto.setTerminal(sessionMBean.getSessionTerminal());
                    UtilCore.General.toUpperCaseDto(dto);
                    editar(dto);
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                    recursosManager.showMessage(mensajeTrx);
                    to = dto;
                } catch (Exception ex) {
                    mensajeTrx = ex.getMessage();
                    recursosManager.showError(ex.getMessage());
                    logger.error(mensajeTrx);
                    to = null;
                }
            }
//            } else {
//                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.remuneraciones_no_ok");
//                recursosManager.showWarning(mensajeTrx);
//            }
        }
        return to;
    }

    public String cesarContrato(ContratoDto dto, String accionCont) {
        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        try {
            if (accionCont.equals(ConstantesCont.Formulario.TIPO_CONT_CESAR)) {
                dto.setUsuarioCeseDto(sessionMBean.getSessionUsuarioDto());
                dto.setFechaCese(UtilCore.Fecha.obtenerFechaActualDate());
                dto.setEstadoDto(new ParametroDto(ConstantesCont.Parametro.CONT_ESTADO_ARCHIVADO));
                editar(dto);
                // Actualizamos el indicador EMP de la tabla persona
                PersonaDto p = this.personaManager.obtenerPersonaPorId(dto.getPersonaDto().getId());
                p.setEmp(Boolean.FALSE);
                this.personaManager.editar(p);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);
                to = "";
            }

        } catch (Exception ex) {
            mensajeTrx = ex.getMessage();
            recursosManager.showError(ex.getMessage());
            logger.error(mensajeTrx);
            to = null;
        }
        return to;
    }

    protected Boolean validarDatosContrato(ContratoDto contratoDto) {
        Boolean resultado = true;
        if (UtilCore.Fecha.diferenciaDiasFechas(contratoDto.getFechaFin(), contratoDto.getFechaInicio()) > 0) {
            recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.valid.fecha_ini_fin"));
            resultado = false;
        }

//        if (contratoDto.getRemVariable().compareTo(contratoDto.getRemAlCargo()) >= 0) {
//            recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.valid.nivel.remuneracion"));
//            resultado = false;
//        }

        if (contratoDto.getFechaRecategorizacion() != null) {
            if (UtilCore.Fecha.diferenciaDiasFechas(contratoDto.getFechaFin(), contratoDto.getFechaRecategorizacion()) > 0) {
                recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.valid.fecha_recat_fecha_fin"));
                resultado = false;
            }
            if (UtilCore.Fecha.diferenciaDiasFechas(contratoDto.getFechaRecategorizacion(), contratoDto.getFechaInicio()) > 0) {
                recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.valid.fecha_recat_fecha_inicio"));
                resultado = false;
            }
        }
        if (contratoDto.getFechaNivelacion() != null) {
//            if (contratoDto.getRemAlCargo().compareTo(contratoDto.getRemBasica()) == 0) {
//                recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.valid.nivel.remuneracion"));
//                resultado = false;
//            }
            if (contratoDto.getPorRemunerativo().compareTo(new BigDecimal("100")) >= 0) {
                recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.valid.porc.remuneracion"));
                resultado = false;
            }
            if (UtilCore.Fecha.diferenciaDiasFechas(contratoDto.getFechaFin(), contratoDto.getFechaNivelacion()) > 0) {
                recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.valid.fecha_nivel_fecha_fin"));
                resultado = false;
            }
            if (UtilCore.Fecha.diferenciaDiasFechas(contratoDto.getFechaNivelacion(), contratoDto.getFechaInicio()) > 0) {
                recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.valid.fecha_nivel_fecha_inicio"));
                resultado = false;
            }
        } else {
            if (contratoDto.getPorRemunerativo() != null) {
                if (contratoDto.getPorRemunerativo().compareTo(new BigDecimal("100")) < 0) {
                    recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.valid.porc_remun_fec_nivelacion"));
                    resultado = false;
                }
            }
        }



        return resultado;
    }

    public void generarExcelSeleccionadosPorRenovar(ContratoDto[] selectedConts) {
        if (selectedConts.length > 0) {
            StringBuilder strCabecera = this.obtenerCabeceraExcel();
            List<ContratoDto> lst = Arrays.asList(selectedConts);
            List lstCuerpo = this.obtenerCuerpoExcel(lst);
            String nombreArchivo = ConstantesCont.ValoresConstantes.PREF_NOM_EXCEL + "POR_RENOVAR_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
            this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
            this.recursosManager.viewArchivo(nombreArchivo);
        } else {
            this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.selecc.contrato"));
        }
    }

    public void generarExcelPorTablaPorRenovar(List<ContratoDto> lst) {
        if (!lst.isEmpty()) {
            StringBuilder strCabecera = this.obtenerCabeceraExcel();
            List lstCuerpo = this.obtenerCuerpoExcel(lst);
            String nombreArchivo = ConstantesCont.ValoresConstantes.PREF_NOM_EXCEL + "POR_RENOVAR_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
            this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
            this.recursosManager.viewArchivo(nombreArchivo);
        } else {
            this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.selecc.contrato"));
        }
    }
    
    public void generarExcelSeleccionadosEnviarAPlanilla(ContratoDto[] selectedConts) {
        if (selectedConts.length > 0) {
            StringBuilder strCabecera = this.obtenerCabeceraExcel();
            List<ContratoDto> lst = Arrays.asList(selectedConts);
            List lstCuerpo = this.obtenerCuerpoExcel(lst);
            String nombreArchivo = ConstantesCont.ValoresConstantes.PREF_NOM_EXCEL + "POR_ENVIARPLANILLA_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
            this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
            this.recursosManager.viewArchivo(nombreArchivo);
        } else {
            this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.selecc.contrato"));
        }
    }

    public void generarExcelPorTablaEnviarAPlanilla(List<ContratoDto> lst) {
        if (!lst.isEmpty()) {
            StringBuilder strCabecera = this.obtenerCabeceraExcel();
            List lstCuerpo = this.obtenerCuerpoExcel(lst);
            String nombreArchivo = ConstantesCont.ValoresConstantes.PREF_NOM_EXCEL + "POR_ENVIARPLANILLA_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
            this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
            this.recursosManager.viewArchivo(nombreArchivo);
        } else {
            this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.mensaje.selecc.contrato"));
        }
    }

    protected List obtenerCuerpoExcel(List<ContratoDto> list) {
        List listaContratosDto = new ArrayList();
        StringBuilder strObj;

        for (ContratoDto x : list) {
            UtilCore.General.toUpperCaseDto(x);
            strObj = new StringBuilder();
            if (x.getEstadoDto() != null) {
                strObj.append(x.getEstadoDto().getDescripcion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getPersonaDto().getNombreCompleto() != null) {
                strObj.append(x.getPersonaDto().getNombreCompleto()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getPersonaDto().getNumeroDocumento() != null) {
                strObj.append(x.getPersonaDto().getNumeroDocumento()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getPersonaDto().getEstadoCivilDto() != null) {
                strObj.append(x.getPersonaDto().getEstadoCivilDto().getDescripcion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getFechaSuscripcion() != null) {
                strObj.append(x.getFechaSuscripcion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getFechaInicio() != null) {
                strObj.append(x.getFechaInicio()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getFechaFin() != null) {
                strObj.append(x.getFechaFin()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getUnidadOrganicaDto() != null) {
                strObj.append(x.getUnidadOrganicaDto().getDescripcion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getSedeDto() != null) {
                strObj.append(x.getSedeDto().getDescripcion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getCatRemunerativaDto() != null) {
                strObj.append(x.getCatRemunerativaDto().getDescripcion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getPuestoDto() != null) {
                strObj.append(x.getPuestoDto().getDescripcion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getTipoTrabajadorDto() != null) {
                strObj.append(x.getTipoTrabajadorDto().getDescripcion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getTipoContratoDto() != null) {
                strObj.append(x.getTipoContratoDto().getDescripcion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getRemBasica() != null) {
                strObj.append(x.getRemBasica().toString()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getRemAlCargo() != null) {
                strObj.append(x.getRemAlCargo().toString()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getFechaNivelacion() != null) {
                strObj.append(x.getFechaNivelacion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getRemVariable() != null) {
                strObj.append(x.getRemVariable().toString()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getMovilidad() != null) {
                strObj.append(x.getMovilidad()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getFechaRecategorizacion() != null) {
                strObj.append(x.getFechaRecategorizacion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getComisiones() != null) {
                strObj.append(x.getComisiones().toString()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getAsignacionFamiliar() != null) {
                strObj.append(x.getAsignacionFamiliar().toString()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getRiesgoCaja() != null) {
                strObj.append(x.getRiesgoCaja().toString()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getConvocatoriaDto() != null) {
                strObj.append(x.getConvocatoriaDto().getDescripcion()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            if (x.getObservaciones() != null) {
                strObj.append(x.getObservaciones()).append("|");
            } else {
                strObj.append("-").append("|");
            }
            listaContratosDto.add(strObj.toString());
        }
        return listaContratosDto;
    }

    protected StringBuilder obtenerCabeceraExcel() {
        StringBuilder strCabecera = new StringBuilder();
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("postulante.label.estado")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("postulante.label.nombre_completo")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("postulante.label.doc_ident")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("postulante.label.estado_civil")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.fecha_suscripcion")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.fecha_inicio")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.fecha_fin")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.unidad_organica")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.sede")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.cat_remunerativa")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.puesto")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.tipo_trabajador")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.mod_contratacion")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.remun_basica")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.remun_cargo")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.fecha_nivelacion")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.remun_variable")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.movilidad")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.fec_recategorizacion")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.comisiones")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.asig_familiar")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.riesgo_caja")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.cp")).append("|");
        strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("contrato.label.observaciones"));
        return strCabecera;
    }

    public List<ContratoDto> obtenerConFiltroConOrden(Map<String, Object> filtros, Map<String, String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(ContratoDto.class, filtros, orden);
    }

    public void nuevoMuchos(List<ContratoDto> lista) throws DAOException {
        springHibernateDao.guardarColeccion(lista);
    }

    public void eliminarMuchos(List<ContratoDto> lista) throws DAOException {
        springHibernateDao.borrarColeccion(lista);
    }
}
